#ifndef _NEUL_EC600S_H
#define _NEUL_EC600S_H

#pragma diag_suppress 1295

#include <LIB_Queue.h>
#include <DRV_Neul.h>
#include <DRV_Neul_DA.h>
#include <DRV_Neul_AT.h>
#include <DRV_Event.h>
#include <AT_Main.h>

#define PWRKEYON_TIME    1000/*500*/    //EC600N新模组关机后开机低电平需持续放长到1s
#define PWRKEYOFF_TIME   1650
#define NRSTKEYOFF_TIME  300
#define URCPORT_DEF    "uart1"
#define BAUD_DEF    115200
#define CGREG_URC   1

#define EC600S_MAX_MTU              416/*1460*/     //string数据包最大长度,交流桩数据包最大208字节
#define EC600S_HEX_MAX_MTU          208/*512*/      //16进制数据包最大长度,交流桩数据包最大208字节
#define EC600S_TXDATA_DEFAULT_TO    120000       //发送超时时间,单位毫秒
#define EC600S_FAST_TXDATA_DEFAULT_TO    5000    //快速发送时间间隔,单位毫秒
#define EC600S_DEVSTATE_DEFAULT_TO  90000    //注册超时保护时间,单位毫秒
#define EC600S_REGSTATE_DEFAULT_TO  120000   //注册状态异常保护时间,单位毫秒
#define EC600S_CMD_RESET_TO         60000    //命令复位保护时间,单位毫秒
#define EC600S_HARD_RESET_TO        10000     //硬复位保护时间,单位毫秒
#define EC600S_PWROFF_DELAY         4000

//存储参数ID
#define EC600S_IMEI_ID    0

#pragma pack(1)

typedef enum
{
    EC600S_DEV_DIS=0,
    EC600S_DEV_PWROFF,
    EC600S_DEV_WAIT_PWRON,
    EC600S_DEV_PWRON,
    EC600S_DEV_WAIT_READY,
    EC600S_DEV_READY,
    EC600S_DEV_RESET,
    EC600S_DEV_WAIT_PWROFF,
    EC600S_DEV_TEST,
    EC600S_DEV_UNKNOW
}EN_EC600S_DEV_ST;      //设备状态

typedef enum
{
    EC600S_RST_CMD=0,
    EC600S_RST_PWRKEY,
    EC600S_RST_RSTKEY,
    EC600S_RST_EVENT_CMD,//提供给ec600s任务外函数调用
    EC600S_RST_NONE
}EN_EC600S_RST_TYPE;     //复位类型

typedef struct{
	T_MUTEX mutex;
    int sock;
	int haveData; //0.no data, 1.have data
	U32 tick;
    EN_EC600S_DATA_TYPE data_type;
	U8 data[EC600S_MAX_MTU];
	int len;
}ST_EC600S_TX_DATA;

#pragma pack()

/**
@brief 获取ec600s设备基本信息
@param 无
@return
**/
void Ec600sDevInfoGet(neul_dev_info_t *info);

/**
@brief Ec600s初始化
@param 无
@return
**/
int Ec600sInit(void);
int Ec600sReset(EN_EC600S_RST_TYPE type);
/**
@brief Ec600s主任务
@param 无
@return
**/
void Ec600sThread(void *pvParameter);
/**
@brief 设置ec600s设备状态
@param st 设备状态
@return 无
**/
void Ec600sStSet(EN_EC600S_DEV_ST st);
/**
@brief 查询ec600s设备状态
@param 无
@return ec600s设备状态
**/
EN_EC600S_DEV_ST Ec600sStGet();
/**
@brief 设置ec600s注册状态
@param st 注册状态
@return 无
**/
void Ec600sRegStSet(EN_REG_STATE st);
/**
@brief 查询ec600s注册状态
@param 无
@return ec600s注册状态
**/
EN_REG_STATE Ec600sRegStGet();
/**
@brief 设置ec600s注册状态
@param sock 套接字
@param data_type 数据类型
@param data 数据
@param len 数据长度
@return 0成功，非0错误
**/
int Ec600sDataSend(int sock,EN_EC600S_DATA_TYPE data_type,U8 data[],int len);
/**
@brief 增加30分钟内ec600s网络断连次数
@param num 断连次数
@return 无
**/
void Ec600sDisConTimesAdd(U32 num);
/**
@brief 增加ec600s总网络断连次数
@param 无
@return 断连次数
**/

/**
@brief 查询ec600s总网络断连次数
@param 无
@return 断连次数
**/
U32 Ec600sAllDisConTimesGet();

/**
@brief 增加ec600s总网络断连次数
@param 无
@return 断连次数
**/
void Ec600sAllDisConTimesAdd(U32 num);

/**
@brief 设置ec600s复位类型和复位保护时间
@param type 复位类型
@return 无
**/
void Ec600sRstTypeSet(EN_EC600S_RST_TYPE type);

/**
@brief 查询ec600s复位类型
@param 无
@return ec600s复位类型
**/
EN_EC600S_RST_TYPE Ec600sRstTypeGet();

/**
@brief 掉电倒计时计数器重新计时
@param 无
@return
**/
int Ec600sTPwrOffReCountDown();

/**
@brief ec600s状态变化处理函数
@return 0成功，非0失败
**/
int Ec600sStateChgReg(neul_state_chg func);

/**
@brief ec600s注册状态变化处理函数
@return 0成功，非0失败
**/
int Ec600sDevChgReg(neul_state_chg func);
/**
@brief ec600s power off, fct低功耗调用
@param 无
@return
**/
int Ec600sPwrOff();
/**
@brief is ec600s power on?, fct复位调用
@param 无
@return
**/
int Ec600sIsPwrOn();

/**
@brief 清空uart data缓存
@return 无
**/
int Ec600sUartDataFlush();

/**
@brief ec600 kress power key
@param t gpio action delay time,单位毫秒
@return ec600s复位类型
**/
int Ec600sPwrKeyPullDown(int t);

/**
@brief ec600 kress reset key
@param t gpio action delay time,单位毫秒
@return ec600s复位类型
**/
int Ec600sRstKeyPullDown(int t);

#endif

